package csw;

import java.util.ArrayList;

public class J19Generic {

	public static void main(String []args){
		
		//고정 크기 배열
		Tiger zoo1[] = new Tiger[3];
		//호랑이를 가두기 위한 동물원
		Lion[] zoo2 = new Lion[3];
		//사자를 가두기 위한 동물원
		Zebra[] zoo3 = new Zebra[3];
		//얼룩말을 가두기 위한 동물원
		Animal zoo4[] = new Animal[3];
		//호랑이,사자,얼룩말을 가둘수 있는 동물원		
		//호랑이,사자,얼룩말은 animal과 상속관계		
		Object zoo5[] = new Object[3];
		//호랑이,사자,얼룩말뿐만 아니라
		//언급되지 않은 다른 동물들도 가둘수 있는 동물원
		//Object 클래스는 모든 클래스의 조상
		
		zoo1[1] = new Tiger();
		//zoo1[2] = new Zebra();
			//zoo1은 Tiger만 담을 수 있음
		
		zoo4[0] = new Tiger();
		zoo4[1] = new Lion();
		zoo4[2] = new Zebra();
		//zoo4[1] = new Monkey(); 오류??
			//Monkey는 Animal과 상속관계가 아님
		
		zoo5[0] = new Tiger();
		zoo5[1] = new Monkey();
		
		Animal animal1 = zoo4[1];
			//Lion lion1 = zoo4[1]; 오류??
			//Animal(부모) 객체를 Lion(자식) 객체에
			//저장하려면 먼저 douncasting해야 함
		Lion lion1 = (Lion) zoo4[1];
			//따라서, douncasting 시
			// 명시적으로 변환하려는 자료형을 기술하는 것은
			// 다소 귀찮을수 있당.
		
		//컬렉션(가변 크기 배열)
		//컬렉션에서는 어떤 종류의 자료를 담을지
		//모르기 때문에 최상위 조상객체인 Object형태로
		//저장 및 관리 하도록 설계되어 있음
	
		ArrayList zoo6 = new ArrayList();// Jdk 4- 이하 5이상 쓸것 권장
		zoo6.add(new Tiger());
		zoo6.add(new Lion());
		zoo6.add(new Zebra());
		zoo6.add(new Monkey());
		zoo6.add(new Whale());
		
		//지네릭을 이용하면 프로그래머가 컬렉션에
		//사용할 객체의 유형을 명확하게 지정해서
		//이 유형과 다른 객체는 저장되지 못하게 함
		//따라서, 컴파일시 오류확인이  빨라짐
		ArrayList<Tiger> zoo7 = new ArrayList<Tiger>();
		zoo7.add(new Tiger());
			//zoo7에는 지네릭으로Tiger만 객체
			//저장할 수 있도록 한정시킴
			//따라서,예상치 ㅁ소한 오류가 발생할수 있는
		//가능성은 낮아짐
		
		ArrayList<Lion> zoo8= new ArrayList<>();// JDk7+
		
		
	}//main
}//class
	
	class Animal{}
	class Tiger extends Animal{}
	class Lion extends Animal{}
	class Zebra extends Animal{}
	class Whale{}
	class Monkey{}